package com.twfpro.web;

import java.util.ArrayList;
import java.util.List;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;

import com.twfpro.web.Locator.Type;

public class Element
{
	protected WebElement webElement;
	private Browser browser;

	/**
	 * 获取一个元素
	 * 
	 * @param browser
	 *            浏览器对象
	 * @param type
	 *            元素类型
	 * @param value
	 *            元素值
	 * @return 元素
	 */
	public static Element element(Browser browser, Type type, String value)
	{
		Locator locator = new Locator(type, value);
		browser.driverWait.until(ExpectedConditions.presenceOfElementLocated(locator.by));
		Element element = new Element();
		element.browser = browser;
		element.webElement = browser.driver.findElement(locator.by);
		return element;
	}

	/**
	 * 获取一组元素
	 * 
	 * @param browser
	 *            浏览器对象
	 * @param type
	 *            元素类型
	 * @param value
	 *            元素值
	 * @return 元素数组
	 */
	public static ArrayList<Element> elements(Browser browser, Type type, String value)
	{
		Locator locator = new Locator(type, value);
		browser.driverWait.until(ExpectedConditions.presenceOfElementLocated(locator.by));
		List<WebElement> webElementList = browser.driver.findElements(locator.by);
		ArrayList<Element> elementList = new ArrayList<>();
		for (WebElement webElement : webElementList)
		{
			Element element = new Element();
			element.browser = browser;
			element.webElement = webElement;
			elementList.add(element);
		}
		return elementList;
	}

	/**
	 * 清空，如：清空输入框
	 */
	public void clear()
	{
		webElement.clear();
	}

	/**
	 * 点击，如：点击按钮
	 */
	public void click()
	{
		browser.driverWait.until(ExpectedConditions.elementToBeClickable(webElement));
		webElement.click();
	}

	/**
	 * 无等待点击，如：点击按钮
	 */
	public void clickNoWait()
	{
		webElement.click();
	}

	/**
	 * 获取一个子元素
	 * 
	 * @param type
	 *            子元素类型
	 * @param value
	 *            子元素值
	 * @return 子元素
	 */
	public Element findElement(Type type, String value)
	{
		Locator locator = new Locator(type, value);
		browser.driverWait.until(ExpectedConditions.presenceOfElementLocated(locator.by));
		Element element = new Element();
		element.browser = browser;
		element.webElement = this.webElement.findElement(locator.by);
		return element;
	}

	/**
	 * 获取一组子元素
	 * 
	 * @param type
	 *            子元素类型
	 * @param value
	 *            子元素值
	 * @return 子元素数组
	 */
	public ArrayList<Element> findElements(Type type, String value)
	{
		Locator locator = new Locator(type, value);
		browser.driverWait.until(ExpectedConditions.presenceOfElementLocated(locator.by));
		List<WebElement> webElementList = browser.driver.findElements(locator.by);
		ArrayList<Element> elementList = new ArrayList<Element>();
		for (WebElement webElement : webElementList)
		{
			Element element = new Element();
			element.browser = browser;
			element.webElement = webElement;
			elementList.add(element);
		}
		return elementList;
	}

	/**
	 * 获取属性值
	 * 
	 * @param attribute
	 *            属性名
	 * @return 属性值
	 */
	public String getAttribute(String attribute)
	{
		return webElement.getAttribute(attribute);
	}

	/**
	 * 获取文本内容
	 * 
	 * @return 文本内容
	 */
	public String getText()
	{
		return this.webElement.getText();
	}

	/**
	 * 判断是否已显示
	 * 
	 * @return 已显示，返回true；否则返回false
	 */
	public boolean isDisplayed()
	{
		return webElement.isDisplayed();
	}

	/**
	 * 判断是否已选择
	 * 
	 * @return 已选择，返回true；否则返回false
	 */
	public Boolean isSelected()
	{
		return this.webElement.isSelected();
	}

	/**
	 * 选择，如：选择列表中的条目
	 * 
	 * @param value
	 *            选择值
	 */
	public void select(String value)
	{
		Select select = new Select(webElement);
		select.selectByValue(value);
	}

	/**
	 * 输入文字，如：输入文字到输入框
	 * 
	 * @param input
	 *            文字内容
	 */
	public void type(CharSequence... input)
	{
		webElement.sendKeys(input);
	}

	/**
	 * 等待到可以点击
	 */
	public void waitToBeClickable()
	{
		browser.driverWait.until(ExpectedConditions.elementToBeClickable(this.webElement));
	}

	/**
	 * 等待到显示
	 */
	public void waitToBeVisible()
	{
		browser.driverWait.until(ExpectedConditions.visibilityOf(this.webElement));
	}

	/**
	 * 等待到不显示
	 */
	public void waitToBeInvisible()
	{
		browser.driverWait.until(ExpectedConditions.invisibilityOf(this.webElement));
	}
}
